package com;

import java.util.ArrayList;
import java.util.Scanner;

public class StudentManagerSystem {
    public static void main(String[] args) {
        /*
        0.初始化项目需要使用的Scanner用于接收键盘录入的值.
        初始化ArrayList<Student> 用于保存项目中所有的学生对象信息.
         */
        Scanner sc = new Scanner(System.in);
        ArrayList<Student> studentList = new ArrayList<>();

        //1.主菜单页面输出到控制台.
        while (true) {
            System.out.println("---欢迎使用传智播客学生管理系统---");
            System.out.println("--------(1) 添加学生信息--------");
            System.out.println("--------(2) 查看学生信息--------");
            System.out.println("--------(3) 修改学生信息--------");
            System.out.println("--------(4) 删除学生信息--------");
            System.out.println("--------(5) 退出管理系统--------");
            System.out.println("--------------------------------");
            System.out.println("请输入您的操作编号:");
            int choose = sc.nextInt();
            switch (choose) {
                case 1:
                    addStudent(studentList);
                    break;
                case 2:
                    showStudent(studentList);
                    break;
                case 3:
                    updateStudent(studentList);
                    break;
                case 4:
                    deleteStudent(studentList);
                    break;
                case 5:
                    System.out.println("欢迎您的下次使用.");
                    //通过Java命令关闭Java虚拟机(参数0为正常关闭 非0为异常关闭)
                    System.exit(0);
                    break;
                default:
                    System.out.println("您的操作编号,请重新输入.");
                    break;
            }
        }
    }


    /**
     * 1.添加学生信息.
     *
     * @param studentList studentList存储了全局所有的student对象.
     */
    private static void addStudent(ArrayList<Student> studentList) {
        //1.初始化Scanner对象用户接受键盘录入的值.
        Scanner sc = new Scanner(System.in);

        //2.提示用户录入数据.
        String sid = null;
        while (true) {
            System.out.println("请输入新学生的学号:");
            sid = sc.next();
            boolean result = isSidUsed(sid, studentList);
            if (result) {
                //如果执行到这个地方,则说明result是true,说明学号重复,提示用户并且重新输入.
                System.out.println("您输入的学号" + sid + "已存在于系统,请您重新输入新的学号.");
            } else {
                //如果执行到这个地方,则说明result是false,说明不重复,继续向下执行 -> 停止while循环.
                break;
            }
        }
        System.out.println("请输入新学生的姓名:");
        String name = sc.next();
        System.out.println("请输入新学生的年龄:");
        int age = sc.nextInt();

        //3.将输入的三个数据封装为Student对象并且存储到studentList中.
        Student student = new Student(sid, name, age);
        studentList.add(student);

        System.out.println("学生信息添加成功!");
    }

    /**
     * 判断学号是否存在 -> 录入一个学号,判断学号是否存在于系统(集合)中.
     *
     * @param sid         要判断学号信息
     * @param studentList studentList存储了全局所有的student对象.
     * @return 如果studentList中的某个student对象的sid与参数sid相同, 则证明学号重复, 返回true, 如果没有重复, 则返回false.
     */
    private static boolean isSidUsed(String sid, ArrayList<Student> studentList) {
        //1.遍历studentList集合,获取到每一个student对象.
        for (int i = 0; i < studentList.size(); i++) {
            Student student = studentList.get(i);
            if (student.getSid().equals(sid)) {
                return true;
            }
        }
        //2.当for循环结束,If判断没有执行,则说明学号不重复,返回false.
        return false;
    }

    /**
     * 2.查看所有学生信息的方法
     *
     * @param studentList studentList存储了全局所有的student对象.
     */
    private static void showStudent(ArrayList<Student> studentList) {
        //1.判断传入进来的参数里面是否有数据.
        if (studentList.isEmpty()) {
            //2.当执行到这个地方,说明studentList没有数据,则打印提示语句并结束方法.
            System.out.println("当前系统中没有学生数据,请录入数据后重新查询.");
            return;
        }
        //3.输出学生信息 -> (1)表头
        System.out.println("学号   \t姓名   \t年龄");
        for (int i = 0; i < studentList.size(); i++) {
            Student student = studentList.get(i);
            System.out.println(student.getSid() + "\t\t" + student.getName() + "\t" + student.getAge());
        }
    }

    /**
     * 3.根据输入的学号删除学生信息的方法
     *
     * @param studentList studentList存储了全局所有的student对象.
     */
    private static void deleteStudent(ArrayList<Student> studentList) {
        //1.初始化Scanner用于接收键盘输入的学号信息.
        Scanner sc = new Scanner(System.in);
        //2.提示用户输入要删除的学员.
        System.out.println("请您输入要删除的学生的学号:");
        String sid = sc.next();
        //3.遍历studentList获取到每一个学生对象.
        for (int i = 0; i < studentList.size(); i++) {
            Student student = studentList.get(i);
            //每次循环的过程中,都获取到一个student对象,判断student对象的sid和输入的要删除的sid是否相同.
            if (student.getSid().equals(sid)) {
                //如果IF判断为true,则证明本次(第i次) i索引对应的内容就是我们想要删除的内容,直接删除就可以.
                Student temp = studentList.remove(i);
                System.out.println("您已将学号为:" + temp.getSid() + "姓名为:" + temp.getName() + "的信息删除.");
                return; //为了不执行下面的代码(如果能执行return 就代表已经删除了要删除的元素)
            }
        }
        System.out.println("您输入的学号不存在,即将返回主菜单,请您重新操作.");
    }


    /**
     * 4.修改学生信息
     *
     * @param studentList studentList存储了全局所有的student对象.
     */
    private static void updateStudent(ArrayList<Student> studentList) {
        //1.初始化Scanner用于接收键盘输入的学号信息.
        Scanner sc = new Scanner(System.in);
        //2.提示用户输入要删除的学员.
        System.out.println("请您输入要修改的学生的学号:");
        String sid = sc.next();
        //3.遍历studentList获取到每一个学生对象.
        for (int i = 0; i < studentList.size(); i++) {
            Student student = studentList.get(i);
            //每次循环的过程中,都获取到一个student对象,判断student对象的sid和输入的要修改的sid是否相同.
            if (student.getSid().equals(sid)) {
                //要去输入修改后的学生姓名和学生年龄 + sid 重新封装为一个Student对象 替换i索引对应的数据.
                System.out.println("请输入修改后的学生姓名:");
                String newName = sc.next();
                System.out.println("请输入修改后的学生年龄:");
                int newAge = sc.nextInt();
                Student newStudent = new Student(sid, newName, newAge);
                Student oldStudent = studentList.set(i, newStudent);
                System.out.println("修改前学生姓名为:" + oldStudent.getName() + "学生年龄为:" + oldStudent.getAge());
                System.out.println("修改后学生姓名为:" + newStudent.getName() + "学生年龄为:" + newStudent.getAge());
                return;
            }
        }
        System.out.println("您输入的学号不存在,即将返回主菜单,请您重新操作.");
    }

}

